home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 32 1998 April
/
CICA32 (April 1998) (Disc 4 of 4).iso
/
utils
/
unzip531.tgz
/
unzip531.tar
/
mac
/
macunzip.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-03-28
|
22KB
|
737 lines
#define UNZIP_INTERNAL
#include "unzip.h"
#include "version.h"
#include <Traps.h>
#include <Values.h>
char UnzipVersion[32], ZipinfoVersion[32];
void MacFSTest (int);
void ResolveMacVol (short, short *, long *, StringPtr);
void screenOpen(char *);
void screenControl(char *, int);
void screenClose(void);
#define aboutAlert 128
#define selectDialog 129
#define okItem 1
#define cancelItem 2
#define editItem 3
#define staticItem 4
#define unzipMenuBar 128
#define appleMenu 128
#define aboutItem 1
#define fileMenu 129
#define extractItem 1
#define infoItem 2
#define listItem 3
#define testItem 4
#define commentItem 6
#define freshenItem 8
#define updateItem 9
#define quitItem 11
#define editMenu 130
#define cutItem 1
#define copyItem 2
#define pasteItem 3
#define modifierMenu 131
#define excludeItem 1
#define selectItem 2
#define quietItem 9
#define verboseItem 10
#define screenMenu 132
#define pauseItem 1
#define scrollItem 2
#define extractMenu 133
#define screenItem 3
#define junkItem 5
#define caseMenu 134
#define insensitiveItem 1
#define lowercaseItem 2
#define convertMenu 135
#define autoItem 1
#define binaryItem 2
#define textItem 3
#define overwriteMenu 136
#define alwaysItem 1
#define neverItem 2
#define promptItem 3
#define infoMenu 137
#define prtCommentItem 2
#define prtHeaderItem 3
#define prtTotalsItem 4
#define formatMenu 138
#define filenameItem 1
#define longItem 2
#define mediumItem 3
#define shortItem 4
long modifiers, modifierMask;
#define allFlags 0x000FFFFF
#define quietFlag 0x00000001
#define verboseFlag 0x00000002
#define pauseFlag 0x00080000
#define scrollFlag 0x00040000
#define screenFlag 0x00000004
#define junkFlag 0x00000008
#define insensitiveFlag 0x00000010
#define lowercaseFlag 0x00000020
#define autoFlag 0x00000040
#define textFlag 0x00000080
#define neverFlag 0x00000100
#define overwriteFlag 0x00000200
#define prtCommentFlag 0x00000400
#define prtHeaderFlag 0x00000800
#define prtTotalsFlag 0x00001000
#define filenameFlag 0x00002000
#define longFlag 0x00004000
#define mediumFlag 0x00008000
#define shortFlag 0x00010000
#define extractMask 0x000003FD
#define infoMask 0x0001FE02
#define listMask 0x00000001
#define testMask 0x00000001
#define commentMask 0x00000000
#define freshenMask 0x000003FD
#define updateMask 0x000003FD
EventRecord myevent;
MenuHandle appleHandle, modifierHandle, screenHandle, extractHandle;
MenuHandle caseHandle, convertHandle, overwriteHandle, infoHandle;
MenuHandle formatHandle;
Handle menubar, itemHandle;
short itemType;
Rect itemRect;
char command, fileList[256];
Boolean stop;
SysEnvRec sysRec;
char *macgetenv(s) char *s; {
if (s == NULL) return(fileList);
return(NULL);
}
Boolean TrapAvailable(machineType, trapNumber, trapType)
short machineType;
short trapNumber;
TrapType trapType;
{
if (machineType < 0)
return (false);
if ((trapType == ToolTrap) &&
(machineType > envMachUnknown) &&
(machineType < envMacII)) {
if ((trapNumber &= 0x03FF) > 0x01FF)
trapNumber = _Unimplemented;
}
return (NGetTrapAddress(trapNumber, trapType) !=
GetTrapAddress(_Unimplemented));
}
void domenu(menucommand) long menucommand;
{
short themenu, theitem;
DialogPtr thedialog;
Str255 name;
long check;
themenu = HiWord(menucommand);
theitem = LoWord(menucommand);
switch (themenu) {
case appleMenu:
if (theitem == aboutItem) {
ParamText((StringPtr)UnzipVersion, (StringPtr)ZipinfoVersion, nil, nil);
Alert(aboutAlert, nil);
} else {
GetItem(appleHandle, theitem, name);
theitem = OpenDeskAcc(name);
}
break;
case fileMenu:
switch (theitem) {
case extractItem:
if (modifiers & screenFlag)
command = 'c';
else
command = 'x';
modifierMask = extractMask;
break;
case infoItem:
command = 'Z';
modifierMask = infoMask;
break;
case listItem:
if (modifiers & verboseFlag)
command = 'v';
else
command = 'l';
modifierMask = listMask;
break;
case testItem:
command = 't';
modifierMask = testMask;
break;
case commentItem:
command = 'z';
modifierMask = commentMask;
break;
case freshenItem:
command = 'f';
modifierMask = freshenMask;
break;
case updateItem:
command = 'u';
modifierMask = updateMask;
break;
case quitItem:
stop = true;
break;
default:
break;
}
break;
case editMenu:
break;
case modifierMenu:
switch (theitem) {
case excludeItem:
check = -1;
break;
case selectItem:
thedialog = GetNewDialog(selectDialog, nil, (WindowPtr)(-1));
SetPort(thedialog);
do
ModalDialog(nil, &theitem);
while ((theitem != okItem) && (theitem != cancelItem));
if (theitem == okItem) {
GetDItem(thedialog, editItem, &itemType, &itemHandle, &itemRect);
GetIText(itemHandle, (StringPtr)&fileList);
p2cstr(fileList);
}
DisposDialog(thedialog);
check = -1;
break;
case quietItem:
check = (modifiers ^= quietFlag) & quietFlag;
break;
case verboseItem:
check = (modifiers ^= verboseFlag) & verboseFlag;
break;
default:
break;
}
if (check == 0)
CheckItem(modifierHandle, theitem, false);
else if (check > 0)
CheckItem(modifierHandle, theitem, true);
break;
case screenMenu:
switch (theitem) {
case pauseItem:
check = (modifiers ^= pauseFlag) & pauseFlag;
screenControl("p", check);
break;
case scrollItem:
check = (modifiers ^= scrollFlag) & scrollFlag;
screenControl("s", check);
break;
default:
break;
}
if (check == 0)
CheckItem(screenHandle, theitem, false);
else if (check > 0)
CheckItem(screenHandle, theitem, true);
break;
case extractMenu:
switch (theitem) {
case screenItem:
check = (modifiers ^= screenFlag) & screenFlag;
break;
case junkItem:
check = (modifiers ^= junkFlag) & junkFlag;
break;
default:
break;
}
if (check == 0)
CheckItem(extractHandle, theitem, false);
else if (check > 0)
CheckItem(extractHandle, theitem, true);
break;
case caseMenu:
switch (theitem) {
case insensitiveItem:
check = (modifiers ^= insensitiveFlag) & insensitiveFlag;
break;
case lowercaseItem:
check = (modifiers ^= lowercaseFlag) & lowercaseFlag;
break;
default:
break;
}
if (check == 0)
CheckItem(caseHandle, theitem, false);
else if (check > 0)
CheckItem(caseHandle, theitem, true);
break;
case convertMenu:
switch (theitem) {
case autoItem:
CheckItem(convertHandle, autoItem, true);
CheckItem(convertHandle, binaryItem, false);
CheckItem(convertHandle, textItem, false);
modifiers &= (allFlags ^ textFlag);
modifiers |= autoFlag;
break;
case binaryItem:
CheckItem(convertHandle, autoItem, false);
CheckItem(convertHandle, binaryItem, true);
CheckItem(convertHandle, textItem, false);
modifiers &= (allFlags ^ (autoFlag | textFlag));
break;
case textItem:
CheckItem(convertHandle, autoItem, false);
CheckItem(convertHandle, binaryItem, false);
CheckItem(convertHandle, textItem, true);
modifiers &= (allFlags ^ autoFlag);
modifiers |= textFlag;
break;
default:
break;
}
break;
case overwriteMenu:
switch (theitem) {
case alwaysItem:
CheckItem(overwriteHandle, alwaysItem, true);
CheckItem(overwriteHandle, neverItem, false);
CheckItem(overwriteHandle, promptItem, false);
modifiers &= (allFlags ^ neverFlag);
modifiers |= overwriteFlag;
break;
case neverItem:
CheckItem(overwriteHandle, alwaysItem, false);
CheckItem(overwriteHandle, neverItem, true);
CheckItem(overwriteHandle, promptItem, false);
modifiers &= (allFlags ^ overwriteFlag);
modifiers |= neverFlag;
break;
case promptItem:
CheckItem(overwriteHandle, alwaysItem, false);
CheckItem(overwriteHandle, neverItem, false);
CheckItem(overwriteHandle, promptItem, true);
modifiers &= (allFlags ^ (neverFlag | overwriteFlag));
break;
default:
break;
}
break;
case infoMenu:
switch (theitem) {
case prtCommentItem:
check = (modifiers ^= prtCommentFlag) & prtCommentFlag;
break;
case prtHeaderItem:
check = (modifiers ^= prtHeaderFlag) & prtHeaderFlag;
break;
case prtTotalsItem:
check = (modifiers ^= prtTotalsFlag) & prtTotalsFlag;
break;
default:
break;
}
if (check == 0)
CheckItem(infoHandle, theitem, false);
else if (check > 0)
CheckItem(infoHandle, theitem, true);
break;
case formatMenu:
switch (theitem) {
case filenameItem:
CheckItem(formatHandle, filenameItem, true);
CheckItem(formatHandle, longItem, false);
CheckItem(formatHandle, mediumItem, false);
CheckItem(formatHandle, shortItem, false);
modifiers &= (allFlags ^ (longFlag | mediumFlag | shortFlag));
modifiers |= filenameFlag;
break;
case longItem:
CheckItem(formatHandle, filenameItem, false);
CheckItem(formatHandle, longItem, true);
CheckItem(formatHandle, mediumItem, false);
CheckItem(formatHandle, shortItem, false);
modifiers &= (allFlags ^ (filenameFlag | mediumFlag | shortFlag));
modifiers |= longFlag;
break;
case mediumItem:
CheckItem(formatHandle, filenameItem, false);
CheckItem(formatHandle, longItem, false);
CheckItem(formatHandle, mediumItem, true);
CheckItem(formatHandle, shortItem, false);
modifiers &= (allFlags ^ (filenameFlag | longFlag | shortFlag));
modifiers |= mediumFlag;
break;
case shortItem:
CheckItem(formatHandle, filenameItem, false);
CheckItem(formatHandle, longItem, false);
CheckItem(formatHandle, mediumItem, false);
CheckItem(formatHandle, shortItem, true);
modifiers &= (allFlags ^ (filenameFlag | longFlag | mediumFlag));
modifiers |= shortFlag;
break;
default:
break;
}
break;
default:
break;
}
HiliteMenu(0);
return;
}
void dokey(myevent) EventRecord *myevent;
{
char code;
code = (char)(myevent->message & charCodeMask);
if (myevent->modifiers & cmdKey) {
if (myevent->what != autoKey) {
domenu(MenuKey(code));
}
}
return;
}
void domousedown(myevent) EventRecord *myevent;
{
WindowPtr whichwindow;
long code;
code = FindWindow(myevent->where, &whichwindow);
switch (code) {
case inSysWindow:
SystemClick(myevent, whichwindow);
break;
case inMenuBar:
domenu(MenuSelect(myevent->where));
break;
}
return;
}
int main(argc, argv) int argc; char *argv[];
{
struct Globals saveGlobals;
Boolean haveEvent, useWNE;
short markChar;
FILE *fp;
FlushEvents(everyEvent, 0);
InitGraf(&qd.thePort);
InitFonts();
InitWindows();
InitMenus();
TEInit();
InitDialogs(nil);
InitCursor();
CONSTRUCTGLOBALS();
sprintf(UnzipVersion, "%d.%d%d%s of %s", UZ_MAJORVER, UZ_MINORVER,
PATCHLEVEL, BETALEVEL, VERSION_DATE);
sprintf(ZipinfoVersion, "%d.%d%d%s of %s", ZI_MAJORVER, ZI_MINORVER,
PATCHLEVEL, BETALEVEL, VERSION_DATE);
c2pstr(UnzipVersion);
c2pstr(ZipinfoVersion);
SysEnvirons(1, &sysRec);
useWNE = TrapAvailable(sysRec.machineType, _WaitNextEvent, ToolTrap);
SetMenuBar(menubar = GetNewMBar(unzipMenuBar));
DisposeHandle(menubar);
InsertMenu(GetMenu(screenMenu), -1);
InsertMenu(GetMenu(extractMenu), -1);
InsertMenu(GetMenu(caseMenu), -1);
InsertMenu(GetMenu(convertMenu), -1);
InsertMenu(GetMenu(overwriteMenu), -1);
InsertMenu(GetMenu(infoMenu), -1);
InsertMenu(GetMenu(formatMenu), -1);
AddResMenu(appleHandle = GetMHandle(appleMenu), 'DRVR');
modifierHandle = GetMHandle(modifierMenu);
screenHandle = GetMHandle(screenMenu);
extractHandle = GetMHandle(extractMenu);
caseHandle = GetMHandle(caseMenu);
convertHandle = GetMHandle(convertMenu);
overwriteHandle = GetMHandle(overwriteMenu);
infoHandle = GetMHandle(infoMenu);
formatHandle = GetMHandle(formatMenu);
DrawMenuBar();
screenOpen("Unzip");
modifiers = 0;
GetItemMark(modifierHandle, quietItem, &markChar);
if (markChar) modifiers ^= quietFlag;
GetItemMark(modifierHandle, verboseItem, &markChar);
if (markChar) modifiers ^= verboseFlag;
GetItemMark(screenHandle, pauseItem, &markChar);
if (markChar) modifiers ^= pauseFlag;
screenControl("p", markChar);
GetItemMark(screenHandle, scrollItem, &markChar);
if (markChar) modifiers ^= scrollFlag;
screenControl("s", markChar);
GetItemMark(extractHandle, screenItem, &markChar);
if (markChar) modifiers ^= screenFlag;
GetItemMark(extractHandle, junkItem, &markChar);
if (markChar) modifiers ^= junkFlag;
GetItemMark(caseHandle, insensitiveItem, &markChar);
if (markChar) modifiers ^= insensitiveFlag;
GetItemMark(caseHandle, lowercaseItem, &markChar);
if (markChar) modifiers ^= lowercaseFlag;
GetItemMark(convertHandle, autoItem, &markChar);
if (markChar) modifiers ^= autoFlag;
GetItemMark(convertHandle, textItem, &markChar);
if (markChar) modifiers ^= textFlag;
if ((modifiers & (autoFlag | textFlag)) == (autoFlag | textFlag)) {
CheckItem(convertHandle, textItem, false);
modifiers &= (allFlags ^ textFlag);
} else if (modifiers & (autoFlag | textFlag))
CheckItem(convertHandle, binaryItem, false);
else
CheckItem(convertHandle, binaryItem, true);
GetItemMark(overwriteHandle, alwaysItem, &markChar);
if (markChar) modifiers ^= overwriteFlag;
GetItemMark(overwriteHandle, neverItem, &markChar);
if (markChar) modifiers ^= neverFlag;
if ((modifiers & (neverFlag | overwriteFlag)) == (neverFlag | overwriteFlag)) {
CheckItem(overwriteHandle, alwaysItem, false);
CheckItem(overwriteHandle, neverItem, false);
CheckItem(overwriteHandle, promptItem, true);
modifiers &= (allFlags ^ (neverFlag | overwriteFlag));
} else if (modifiers & (neverFlag | overwriteFlag))
CheckItem(overwriteHandle, promptItem, false);
else
CheckItem(overwriteHandle, promptItem, true);
GetItemMark(infoHandle, prtCommentItem, &markChar);
if (markChar) modifiers ^= prtCommentFlag;
GetItemMark(infoHandle, prtHeaderItem, &markChar);
if (markChar) modifiers ^= prtHeaderFlag;
GetItemMark(infoHandle, prtTotalsItem, &markChar);
if (markChar) modifiers ^= prtTotalsFlag;
GetItemMark(formatHandle, filenameItem, &markChar);
if (markChar) modifiers ^= filenameFlag;
GetItemMark(formatHandle, longItem, &markChar);
if (markChar) modifiers ^= longFlag;
GetItemMark(formatHandle, mediumItem, &markChar);
if (markChar) modifiers ^= mediumFlag;
GetItemMark(formatHandle, shortItem, &markChar);
if (markChar) modifiers ^= shortFlag;
if (modifiers & longFlag) {
CheckItem(formatHandle, filenameItem, false);
CheckItem(formatHandle, mediumItem, false);
CheckItem(formatHandle, shortItem, false);
modifiers &= (allFlags ^ (filenameFlag | mediumFlag | shortFlag));
} else if (modifiers & mediumFlag) {
CheckItem(formatHandle, filenameItem, false);
CheckItem(formatHandle, shortItem, false);
modifiers &= (allFlags ^ (filenameFlag | shortFlag));
} else if (modifiers & shortFlag) {
CheckItem(formatHandle, filenameItem, false);
modifiers &= (allFlags ^ filenameFlag);
}
command = ' ';
stop = false;
while (!stop) {
SetCursor(&qd.arrow);
if (useWNE) {
haveEvent = WaitNextEvent(everyEvent, &myevent, MAXLONG, NULL);
} else {
SystemTask();
haveEvent = GetNextEvent(everyEvent, &myevent);
}
if (haveEvent) {
switch (myevent.what) {
case activateEvt:
break;
case keyDown:
case autoKey:
dokey(&myevent);
break;
case mouseDown:
domousedown(&myevent);
break;
case updateEvt:
screenUpdate(myevent.message);
break;
case mouseUp:
case keyUp:
break;
default:
break;
}
}
if (command != ' ') {
char *s, **v, modifierString[32];
SFReply fileRep;
Point p;
int m, n;
SetPt(&p, 40, 40);
SFGetFile(p, "\pSpecify ZIP file:", 0L, -1, nil, 0L, &fileRep);
if (fileRep.good) {
MacFSTest(fileRep.vRefNum);
ResolveMacVol(fileRep.vRefNum, &G.gnVRefNum, &G.glDirID, NULL);
p2cstr((Ptr)fileRep.fName);
modifierMask &= modifiers;
s = modifierString;
*s++ = '-';
if ((command != 'x') && (command != 'Z')) *s++ = command;
if (modifierMask) {
if (modifierMask & (autoFlag | textFlag)) *s++ = 'a';
if (modifierMask & textFlag) *s++ = 'a';
if (modifierMask & insensitiveFlag) *s++ = 'C';
if (!G.HFSFlag || (modifierMask & junkFlag)) *s++ = 'j';
if (modifierMask & lowercaseFlag) *s++ = 'L';
if (modifierMask & neverFlag) *s++ = 'n';
if (modifierMask & overwriteFlag) *s++ = 'o';
if (modifierMask & quietFlag) *s++ = 'q';
if (modifierMask & verboseFlag) *s++ = 'v';
if (modifierMask & prtCommentFlag) *s++ = 'z';
if (modifierMask & prtHeaderFlag) *s++ = 'h';
if (modifierMask & prtTotalsFlag) *s++ = 't';
if (modifierMask & filenameFlag) *s++ = '2';
if (modifierMask & longFlag) *s++ = 'l';
if (modifierMask & mediumFlag) *s++ = 'm';
if (modifierMask & shortFlag) *s++ = 's';
}
if (*(s - 1) == '-') s -= 1;
*s = '\0';
v = (char **)malloc(sizeof(char *));
*v = "unzip";
argc = 1;
envargs(&argc, &v, NULL, NULL);
argv = (char **)malloc((argc + 3) * sizeof(char *));
argv[m = 0] = (command == 'Z') ? "zipinfo" : "unzip";
if (*modifierString) argv[++m] = modifierString;
argv[++m] = (char *)fileRep.fName;
for (n = 1; n < argc; n++) argv[n + m] = v[n];
argv[argc += m] = NULL;
free(v);
for (n = 0; argv[n] != NULL; n++) printf("%s ", argv[n]);
printf("...\n\n");
memcpy(&saveGlobals, &G, sizeof(struct Globals));
unzip(__G__ argc, argv);
memcpy(&G, &saveGlobals, sizeof(struct Globals));
printf("\nDone\n");
screenControl("r", 0);
}
fileList[0] = '\0';
command = ' ';
}
}
screenClose();
DESTROYGLOBALS()
ExitToShell();
}